﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once
#include "GcmpModelInterface.h"
#include "ModelViewEnums.h"

namespace gcmp
{
    class IElement;
    struct ElementCloudStandardContent;
    class IDocument;
    class IGraphicsNode;
    enum class GraphicsNodeType;

    /// \brief Grep数据使用模式
    enum class ConsumptionFlags : int32_t
    {
        ForReference = 0x0001,                      ///< Grep用于端上跨专业链接
        ForLightenView = 0x0002,                    ///< Grep用于web端轻量化显示
        ForAll = ForReference | ForLightenView      ///< Grep可同时用于端上跨专业链接和web端轻量化显示
    };

    /// \brief 显示节点上云信息
    struct GCMP_MODEL_INTERFACE_EXPORT ToBePublishedGNodeInfo
    {
        ConsumptionFlags Flags;  ///< Grep数据使用模式
        ElementId GStyleId;      ///< 节点图形样式id
    };

    
    /// \brief 对象标准数据上云接口
    ///
    /// 工作单元发布时，传入此接口，准备好对象需要上云的标准数据。
    /// \see IDataset::Publish
    class GCMP_MODEL_INTERFACE_EXPORT IElementCloudStandardContentPublisher
    {
    public:
        /// \brief 判断对象是否上云
        /// \param pElement 对象指针
        /// \return bool 需要上云返回true；否则返回false
        virtual bool CanBePublished(const IElement * pElement) const = 0;

        /// \brief 判断对象的模型几何是否上云
        /// \param pElement 对象指针
        /// \return bool 需要上云返回true；否则返回false
        virtual bool IsToPublishElementModelShape(const IElement * pElement) const = 0;

        /// \brief 准备对象的上云内容
        /// \param pElement 对象指针
        /// \return OwnerPtr<ElementCloudStandardContent> 上云的内容 
        /// \see ElementCloudStandardContent
        virtual OwnerPtr<ElementCloudStandardContent> PrepareCloudStandardContent(const IElement * pElement) = 0;

        /// \brief 需要结构化上传的视图信息
        ///
        /// 默认实现返回空值，表示没有需要结构化上传的视图信息。
        ///
        /// \return JSON stringify后的结构化的视图信息。格式要求见协同后端API specification：/v2/dataset/{datasetId}/upload/end
        virtual std::wstring GetViewsInfo();
        

        /// \brief 获取上云显示节点的信息
        /// \param pDoc 文档指针
        /// \param pElement 节点所在对象指针
        /// \param pGNode 显示节点指针
        /// \param nodePath pGNode的节点路径
        /// \param gNodeInfo 节点的显示信息
        /// \return void
        virtual void GetPublishedGNodeInfo
        (
            const IDocument* pDoc,
            const IElement* pElement,
            const IGraphicsNode* pGNode,
            const std::vector<const IGraphicsNode*>& nodePath,
            ToBePublishedGNodeInfo& gNodeInfo
        );

        /// \brief 返回各个需要指定发布几何类型的category以及对应的几何类型。如果只是默认的GraphicsNodeType::Body,不需要返回。
        /// \param publishedNodeTypes 返回category以及对应需要导出的几何类型
        /// \return void
        virtual void GetPublishedGNodeTypeWithCategoryId( std::map<Guid, std::set<GraphicsNodeType>>& publishedNodeTypes);


        //平台将会取用此接口的返回值作为pElement对象关联的类型Id；
        //如果返回的是Invalid，平台会从BasicInformation中取类型Id，作为pElement对象关联的类型Id
        virtual ElementId GetTypeId(const IElement* pElement) const = 0;

        /// \析构函数
        virtual ~IElementCloudStandardContentPublisher();
    };
}
